// ----------------------------------
// RSDK Project: Sonic 1/Sonic 2
// Script Description: Caterkiller Object
// Script Author: Christian Whitehead/Simon Thomley
// Unpacked by Rubberduckycooly's script unpacker
// ----------------------------------

//-------Aliases-------//
private alias 40 : TYPE_CATERKILLER

// Function declarations
reserve function Caterkiller_Function97
reserve function Caterkiller_DebugDraw
reserve function Caterkiller_DebugSpawn
reserve function Caterkiller_Function100
reserve function Caterkiller_Function101
reserve function Caterkiller_Function102

// Static Values

// Tables

function Caterkiller_Function97
	object[arrayPos0].value12 = object[arrayPos0].xpos
	object[arrayPos0].value13 = object[arrayPos0].ypos
	temp0 = object[arrayPos0].xpos
	temp1 = 0xC0000
	if temp7 == 1
		FlipSign(temp1)
	end if
	object[arrayPos0].direction = temp7
	object[arrayPos0].frame = 0
	temp0 += temp1
	object[arrayPos0].value0 = temp0
	object[arrayPos0].value1 = object[arrayPos0].ypos
	object[arrayPos0].value2 = object[arrayPos0].direction
	object[arrayPos0].value3 = 0
	temp0 += temp1
	object[arrayPos0].value4 = temp0
	object[arrayPos0].value5 = object[arrayPos0].ypos
	object[arrayPos0].value6 = object[arrayPos0].direction
	object[arrayPos0].value7 = 0
	temp0 += temp1
	object[arrayPos0].value8 = temp0
	object[arrayPos0].value9 = object[arrayPos0].ypos
	object[arrayPos0].value10 = object[arrayPos0].direction
	object[arrayPos0].value11 = 0
	object[arrayPos0].state = 0
	object[arrayPos0].value14 = 0
end function


function Caterkiller_DebugDraw
	temp0 = object.xpos
	GetBit(temp1, object.direction, 0)
	if temp1 == 0
		temp0 += 0x240000
		temp1 = -0xC0000
	else
		temp0 -= 0x240000
		temp1 = 0xC0000
	end if
	temp2 = 0
	while temp2 < 3
		DrawSpriteFX(16, FX_FLIP, temp0, object.ypos)
		temp0 += temp1
		temp2++
	loop
	DrawSpriteFX(0, FX_FLIP, object.xpos, object.ypos)
end function


function Caterkiller_DebugSpawn
	temp0 = object.ixpos
	temp0 <<= 16
	temp1 = object.iypos
	temp1 <<= 16
	CreateTempObject(TypeName[Caterkiller], 0, temp0, temp1)
	arrayPos0 = object[tempObjectPos].entityPos
	temp7 = object.direction
	CallFunction(Caterkiller_Function97)
end function


function Caterkiller_Function100

	CallFunction(PlayerObject_EnemyPop)
	temp7 = 0
	temp5 = object.xpos
	temp6 = object.ypos
	foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
		BoxCollisionTest(C_TOUCH, object.entityPos, -8, -8, 8, 8, currentPlayer, object[currentPlayer].value40, object[currentPlayer].value38, object[currentPlayer].value41, object[currentPlayer].value39)
		if checkResult == 1
			CallFunction(PlayerObject_BadnikBreak)
		else
			object.xpos = object.value0
			object.ypos = object.value1
			BoxCollisionTest(C_TOUCH, object.entityPos, -8, -8, 8, 8, currentPlayer, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO)
			if checkResult == 1
				CallFunction(PlayerObject_Hit)
				temp7 = 1
			else
				object.xpos = object.value4
				object.ypos = object.value5
				BoxCollisionTest(C_TOUCH, object.entityPos, -8, -8, 8, 8, currentPlayer, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO)
				if checkResult == 1
					CallFunction(PlayerObject_Hit)
					temp7 = 1
				else
					object.xpos = object.value8
					object.ypos = object.value9
					BoxCollisionTest(C_TOUCH, object.entityPos, -8, -8, 8, 8, currentPlayer, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO, HITBOX_AUTO)
					if checkResult == 1
						CallFunction(PlayerObject_Hit)
						temp7 = 1
					end if
				end if
			end if
		end if
		object.xpos = temp5
		object.ypos = temp6
	next
	foreach (TypeName[Bullet], arrayPos0, ACTIVE_ENTITIES)
		BoxCollisionTest(C_TOUCH, object.entityPos, -8, -8, 8, 8, arrayPos0, -6, -4, 6, 4)
		if checkResult == 1
			CallFunction(BulletKill)
		end if
		object.xpos = temp5
		object.ypos = temp6
	next	
	if temp7 == 1
		temp0 = object.frame
		temp0 <<= 15
		object.ypos -= temp0
		CreateTempObject(TypeName[Caterkiller], 0, object.xpos, object.ypos)
		if object.direction == FLIP_NONE
			object[tempObjectPos].xvel = -0x20000
		else
			object[tempObjectPos].xvel = 0x20000
		end if
		object[tempObjectPos].yvel = -0x40000
		object[tempObjectPos].direction = object.direction
		object[tempObjectPos].frame = object.frame
		object[tempObjectPos].frame &= 8
		object[tempObjectPos].state = 5
		object[tempObjectPos].priority = PRIORITY_UNKNOWN
		CreateTempObject(TypeName[Caterkiller], 0, object.value0, object.value1)
		if object.value2 == 0
			object[tempObjectPos].xvel = -0x18000
		else
			object[tempObjectPos].xvel = 0x18000
		end if
		object[tempObjectPos].yvel = -0x40000
		object[tempObjectPos].direction = object.value2
		object[tempObjectPos].frame = 16
		object[tempObjectPos].state = 5
		object[tempObjectPos].priority = PRIORITY_UNKNOWN
		temp0 = object.value7
		temp0 <<= 15
		object.value5 -= temp0
		object.frame -= temp0
		CreateTempObject(TypeName[Caterkiller], 0, object.value4, object.value5)
		if object.value6 == 0
			object[tempObjectPos].xvel = 0x18000
		else
			object[tempObjectPos].xvel = -0x18000
		end if
		object[tempObjectPos].yvel = -0x40000
		object[tempObjectPos].direction = object.value6
		object[tempObjectPos].frame = 16
		object[tempObjectPos].state = 5
		object[tempObjectPos].priority = PRIORITY_UNKNOWN
		CreateTempObject(TypeName[Caterkiller], 0, object.value8, object.value9)
		if object.value10 == 0
			object[tempObjectPos].xvel = 0x20000
		else
			object[tempObjectPos].xvel = -0x20000
		end if
		object[tempObjectPos].yvel = -0x40000
		object[tempObjectPos].direction = object.value10
		object[tempObjectPos].frame = 16
		object[tempObjectPos].state = 5
		object[tempObjectPos].priority = PRIORITY_UNKNOWN
		ResetObjectEntity(object.entityPos, TypeName[Blank Object], 0, object.xpos, object.ypos)
	end if
end function


function Caterkiller_Function101
	temp2 >>= 16
	temp3 >>= 16
	temp3 += 8
	Get16x16TileInfo(temp5, temp2, temp3, TILEINFO_ANGLEA)
	Get16x16TileInfo(temp6, temp2, temp3, TILEINFO_DIRECTION)
	switch temp6
	case 0
		temp5 &= 255
		break
	case 1
		temp5 &= 255
		temp6 = temp5
		temp5 = 256
		temp5 -= temp6
		temp5 &= 255
		break
	case 2
		temp5 >>= 24
		temp5 += 128
		temp6 = temp5
		temp5 = 256
		temp5 -= temp6
		temp5 &= 255
		break
	case 3
		temp5 >>= 24
		temp5 += 128
		temp5 &= 255
		break
	end switch
	checkResult = 0
	if temp4 == 0
		if temp5 < 128
			if temp5 > 24
				checkResult = 1
			end if
		end if
	else
		if temp5 > 128
			if temp5 < 232
				checkResult = 1
			end if
		end if
	end if
end function


function Caterkiller_Function102
	if object.state != 2
		ObjectTileGrip(CSIDE_FLOOR, 0, 8, 0)
		if checkResult == 0
			object.direction ^= FLIP_X
		end if
		temp0 = object.xpos
		temp1 = object.ypos
		temp2 = temp0
		temp3 = temp1
		temp4 = object.direction
		CallFunction(Caterkiller_Function101)
		if checkResult == 1
			object.direction ^= FLIP_X
		end if
	else
		temp0 = object.xpos
		temp1 = object.ypos
	end if
	object.xpos = object.value0
	object.ypos = object.value1
	ObjectTileGrip(CSIDE_FLOOR, 0, 8, 0)
	if checkResult == 0
		object.value2 = object.direction
	end if
	object.value1 = object.ypos
	temp2 = object.value0
	temp3 = object.value1
	temp4 = object.value2
	CallFunction(Caterkiller_Function101)
	if checkResult == 1
		object.value2 = object.direction
	end if
	object.xpos = object.value4
	object.ypos = object.value5
	ObjectTileGrip(CSIDE_FLOOR, 0, 8, 0)
	if checkResult == 0
		object.value6 = object.direction
	end if
	object.value5 = object.ypos
	temp2 = object.value4
	temp3 = object.value5
	temp4 = object.value6
	CallFunction(Caterkiller_Function101)
	if checkResult == 1
		object.value6 = object.direction
	end if
	if object.state != 4
		object.xpos = object.value8
		object.ypos = object.value9
		ObjectTileGrip(CSIDE_FLOOR, 0, 8, 0)
		if checkResult == 0
			object.value10 = object.direction
		end if
		object.value9 = object.ypos
		temp2 = object.value8
		temp3 = object.value9
		temp4 = object.value10
		CallFunction(Caterkiller_Function101)
		if checkResult == 1
			object.value10 = object.direction
		end if
	end if
	object.xpos = temp0
	object.ypos = temp1
end function


event ObjectMain
	switch object.state
	case 0
		object.priority = PRIORITY_ACTIVE
	case 1
		if object.value14 == 0
			object.value14 = 15
			object.state++
			object.frame = -1
			object.value7 = -1
		else
			object.value14--
			CallFunction(Caterkiller_Function100)
			break
		end if
	case 2
		if object.value14 == 0
			object.value14 = 7
			object.state++
		else
			object.value14--
			if object.value2 == 0
				object.value0 -= 0x4000
			else
				object.value0 += 0x4000
			end if
			if object.value6 == 0
				object.value4 -= 0x8000
			else
				object.value4 += 0x8000
			end if
			if object.value10 == 0
				object.value8 -= 0xC000
			else
				object.value8 += 0xC000
			end if
			object.frame++
			object.value7++
			CallFunction(Caterkiller_Function102)
			CallFunction(Caterkiller_Function100)
		end if
		break
	case 3
		if object.value14 == 0
			object.value14 = 15
			object.state++
			object.frame = 16
			object.value7 = 16
		else
			object.value14--
			CallFunction(Caterkiller_Function100)
			break
		end if
	case 4
		if object.value14 == 0
			object.value14 = 7
			object.state = 1
		else
			object.value14--
			if object.direction == FLIP_NONE
				object.xpos -= 0xC000
			else
				object.xpos += 0xC000
			end if
			if object.value2 == 0
				object.value0 -= 0x8000
			else
				object.value0 += 0x8000
			end if
			if object.value6 == 0
				object.value4 -= 0x4000
			else
				object.value4 += 0x4000
			end if
			object.frame--
			object.value7--
			CallFunction(Caterkiller_Function102)
			CallFunction(Caterkiller_Function100)
		end if
		break
	case 5
		object.xpos += object.xvel
		object.ypos += object.yvel
		object.yvel += 0x3800
		if object.yvel > 0
			ObjectTileCollision(CSIDE_FLOOR, 0, 8, 0)
			if checkResult == 1
				object.yvel = -0x40000
			end if
		end if
		
		if object.frame < 16	
			CallFunction(PlayerObject_EnemyPop)
		end if
		
		foreach (GROUP_PLAYERS, currentPlayer, ACTIVE_ENTITIES)
			BoxCollisionTest(C_TOUCH, object.entityPos, -8, -8, 8, 8, currentPlayer, object[currentPlayer].value40, object[currentPlayer].value38, object[currentPlayer].value41, object[currentPlayer].value39)
			if checkResult == 1
				if object.frame < 16
					CallFunction(PlayerObject_BadnikBreak)
				else
					CallFunction(PlayerObject_Hit)
				end if
			end if
		next

		foreach (TypeName[Bullet], arrayPos0, ACTIVE_ENTITIES)
			BoxCollisionTest(C_TOUCH, object.entityPos, -8, -8, 8, 8, arrayPos0, -6, -4, 6, 4)
			if checkResult == 1
				if object.frame < 16
					CallFunction(BulletKill)
				end if
			end if
		next
		
		if object.outOfBounds == 1
			object.type = TypeName[Blank Object]
		end if
		break
	end switch
	if object.state != 5
		if object.outOfBounds == 1
			temp0 = object.xpos
			temp1 = object.ypos
			object.xpos = object.value12
			object.ypos = object.value13
			if object.outOfBounds == 1
				arrayPos0 = object.entityPos
				temp7 = object[arrayPos0].propertyValue
				CallFunction(Caterkiller_Function97)
			else
				object.xpos = temp0
				object.ypos = temp1
			end if
		end if
	end if
end event


event ObjectDraw
	if object.state < 5
		temp0 = object.direction
		object.direction = object.value10
		temp1 = object.value11
		temp1 >>= 1
		temp1 += 16
		DrawSpriteFX(temp1, FX_FLIP, object.value8, object.value9)
		object.direction = object.value6
		temp1 = object.value7
		temp1 >>= 1
		temp1 += 16
		DrawSpriteFX(temp1, FX_FLIP, object.value4, object.value5)
		object.direction = object.value2
		temp1 = object.value3
		temp1 >>= 1
		temp1 += 16
		DrawSpriteFX(temp1, FX_FLIP, object.value0, object.value1)
		object.direction = temp0
		temp0 = object.frame
		temp0 >>= 1
		CheckEqual(object.state, 2)
		temp1 = checkResult
		CheckEqual(object.state, 3)
		temp1 |= checkResult
		if temp1 == 1
			temp0 += 8
		end if
		DrawSpriteFX(temp0, FX_FLIP, object.xpos, object.ypos)
	else
		DrawSpriteFX(object.frame, FX_FLIP, object.xpos, object.ypos)
	end if
end event


event ObjectStartup
	CheckCurrentStageFolder("Zone02")
	if checkResult == 1
		LoadSpriteSheet("MZ/Objects.gif")
		SpriteFrame(-8, -14, 16, 22, 18, 81)
		SpriteFrame(-8, -15, 16, 22, 18, 81)
		SpriteFrame(-8, -16, 16, 22, 18, 81)
		SpriteFrame(-8, -17, 16, 22, 18, 81)
		SpriteFrame(-8, -18, 16, 22, 18, 81)
		SpriteFrame(-8, -19, 16, 22, 18, 81)
		SpriteFrame(-8, -20, 16, 22, 18, 81)
		SpriteFrame(-8, -21, 16, 22, 18, 81)
		SpriteFrame(-8, -14, 16, 24, 1, 81)
		SpriteFrame(-8, -15, 16, 24, 1, 81)
		SpriteFrame(-8, -16, 16, 24, 1, 81)
		SpriteFrame(-8, -17, 16, 24, 1, 81)
		SpriteFrame(-8, -18, 16, 24, 1, 81)
		SpriteFrame(-8, -19, 16, 24, 1, 81)
		SpriteFrame(-8, -20, 16, 24, 1, 81)
		SpriteFrame(-8, -21, 16, 24, 1, 81)
		SpriteFrame(-8, -8, 16, 16, 35, 81)
		SpriteFrame(-8, -9, 16, 16, 35, 81)
		SpriteFrame(-8, -10, 16, 16, 35, 81)
		SpriteFrame(-8, -11, 16, 16, 35, 81)
		SpriteFrame(-8, -12, 16, 16, 35, 81)
		SpriteFrame(-8, -13, 16, 16, 35, 81)
		SpriteFrame(-8, -14, 16, 16, 35, 81)
		SpriteFrame(-8, -15, 16, 16, 35, 81)
	end if
	CheckCurrentStageFolder("Zone03")
	if checkResult == 1
		LoadSpriteSheet("SYZ/Objects.gif")
		SpriteFrame(-8, -14, 16, 22, 98, 98)
		SpriteFrame(-8, -15, 16, 22, 98, 98)
		SpriteFrame(-8, -16, 16, 22, 98, 98)
		SpriteFrame(-8, -17, 16, 22, 98, 98)
		SpriteFrame(-8, -18, 16, 22, 98, 98)
		SpriteFrame(-8, -19, 16, 22, 98, 98)
		SpriteFrame(-8, -20, 16, 22, 98, 98)
		SpriteFrame(-8, -21, 16, 22, 98, 98)
		SpriteFrame(-8, -14, 16, 24, 81, 98)
		SpriteFrame(-8, -15, 16, 24, 81, 98)
		SpriteFrame(-8, -16, 16, 24, 81, 98)
		SpriteFrame(-8, -17, 16, 24, 81, 98)
		SpriteFrame(-8, -18, 16, 24, 81, 98)
		SpriteFrame(-8, -19, 16, 24, 81, 98)
		SpriteFrame(-8, -20, 16, 24, 81, 98)
		SpriteFrame(-8, -21, 16, 24, 81, 98)
		SpriteFrame(-8, -8, 16, 16, 98, 121)
		SpriteFrame(-8, -9, 16, 16, 98, 121)
		SpriteFrame(-8, -10, 16, 16, 98, 121)
		SpriteFrame(-8, -11, 16, 16, 98, 121)
		SpriteFrame(-8, -12, 16, 16, 98, 121)
		SpriteFrame(-8, -13, 16, 16, 98, 121)
		SpriteFrame(-8, -14, 16, 16, 98, 121)
		SpriteFrame(-8, -15, 16, 16, 98, 121)
	end if
	CheckCurrentStageFolder("Zone06")
	if checkResult == 1
		LoadSpriteSheet("SBZ/Objects.gif")
		SpriteFrame(-8, -14, 16, 22, 75, 26)
		SpriteFrame(-8, -15, 16, 22, 75, 26)
		SpriteFrame(-8, -16, 16, 22, 75, 26)
		SpriteFrame(-8, -17, 16, 22, 75, 26)
		SpriteFrame(-8, -18, 16, 22, 75, 26)
		SpriteFrame(-8, -19, 16, 22, 75, 26)
		SpriteFrame(-8, -20, 16, 22, 75, 26)
		SpriteFrame(-8, -21, 16, 22, 75, 26)
		SpriteFrame(-8, -14, 16, 24, 75, 1)
		SpriteFrame(-8, -15, 16, 24, 75, 1)
		SpriteFrame(-8, -16, 16, 24, 75, 1)
		SpriteFrame(-8, -17, 16, 24, 75, 1)
		SpriteFrame(-8, -18, 16, 24, 75, 1)
		SpriteFrame(-8, -19, 16, 24, 75, 1)
		SpriteFrame(-8, -20, 16, 24, 75, 1)
		SpriteFrame(-8, -21, 16, 24, 75, 1)
		SpriteFrame(-8, -8, 16, 16, 75, 49)
		SpriteFrame(-8, -9, 16, 16, 75, 49)
		SpriteFrame(-8, -10, 16, 16, 75, 49)
		SpriteFrame(-8, -11, 16, 16, 75, 49)
		SpriteFrame(-8, -12, 16, 16, 75, 49)
		SpriteFrame(-8, -13, 16, 16, 75, 49)
		SpriteFrame(-8, -14, 16, 16, 75, 49)
		SpriteFrame(-8, -15, 16, 16, 75, 49)
	end if
	CheckCurrentStageFolder("BossRush")
	if checkResult == 1
		LoadSpriteSheet("MBZ/Objects.gif")
		SpriteFrame(-8, -14, 16, 22, 1, 68)
		SpriteFrame(-8, -15, 16, 22, 1, 68)
		SpriteFrame(-8, -16, 16, 22, 1, 68)
		SpriteFrame(-8, -17, 16, 22, 1, 68)
		SpriteFrame(-8, -18, 16, 22, 1, 68)
		SpriteFrame(-8, -19, 16, 22, 1, 68)
		SpriteFrame(-8, -20, 16, 22, 1, 68)
		SpriteFrame(-8, -21, 16, 22, 1, 68)
		SpriteFrame(-8, -14, 16, 24, 18, 68)
		SpriteFrame(-8, -15, 16, 24, 18, 68)
		SpriteFrame(-8, -16, 16, 24, 18, 68)
		SpriteFrame(-8, -17, 16, 24, 18, 68)
		SpriteFrame(-8, -18, 16, 24, 18, 68)
		SpriteFrame(-8, -19, 16, 24, 18, 68)
		SpriteFrame(-8, -20, 16, 24, 18, 68)
		SpriteFrame(-8, -21, 16, 24, 18, 68)
		SpriteFrame(-8, -8, 16, 16, 35, 68)
		SpriteFrame(-8, -9, 16, 16, 35, 68)
		SpriteFrame(-8, -10, 16, 16, 35, 68)
		SpriteFrame(-8, -11, 16, 16, 35, 68)
		SpriteFrame(-8, -12, 16, 16, 35, 68)
		SpriteFrame(-8, -13, 16, 16, 35, 68)
		SpriteFrame(-8, -14, 16, 16, 35, 68)
		SpriteFrame(-8, -15, 16, 16, 35, 68)
	end if
	CheckCurrentStageFolder("Zone00")
	if checkResult == 1
		LoadSpriteSheet("GHZ/Objects3.gif")
		SpriteFrame(-8, -14, 16, 22, 1, 68)
		SpriteFrame(-8, -15, 16, 22, 1, 68)
		SpriteFrame(-8, -16, 16, 22, 1, 68)
		SpriteFrame(-8, -17, 16, 22, 1, 68)
		SpriteFrame(-8, -18, 16, 22, 1, 68)
		SpriteFrame(-8, -19, 16, 22, 1, 68)
		SpriteFrame(-8, -20, 16, 22, 1, 68)
		SpriteFrame(-8, -21, 16, 22, 1, 68)
		SpriteFrame(-8, -14, 16, 24, 18, 68)
		SpriteFrame(-8, -15, 16, 24, 18, 68)
		SpriteFrame(-8, -16, 16, 24, 18, 68)
		SpriteFrame(-8, -17, 16, 24, 18, 68)
		SpriteFrame(-8, -18, 16, 24, 18, 68)
		SpriteFrame(-8, -19, 16, 24, 18, 68)
		SpriteFrame(-8, -20, 16, 24, 18, 68)
		SpriteFrame(-8, -21, 16, 24, 18, 68)
		SpriteFrame(-8, -8, 16, 16, 35, 68)
		SpriteFrame(-8, -9, 16, 16, 35, 68)
		SpriteFrame(-8, -10, 16, 16, 35, 68)
		SpriteFrame(-8, -11, 16, 16, 35, 68)
		SpriteFrame(-8, -12, 16, 16, 35, 68)
		SpriteFrame(-8, -13, 16, 16, 35, 68)
		SpriteFrame(-8, -14, 16, 16, 35, 68)
		SpriteFrame(-8, -15, 16, 16, 35, 68)
	end if
	foreach (TypeName[Caterkiller], arrayPos0, ALL_ENTITIES)
		temp7 = object[arrayPos0].propertyValue
		CallFunction(Caterkiller_Function97)
	next
	SetTableValue(TypeName[Caterkiller], DebugMode_ObjCount, DebugMode_TypesTable)
	SetTableValue(Caterkiller_DebugDraw, DebugMode_ObjCount, DebugMode_DrawTable)
	SetTableValue(Caterkiller_DebugSpawn, DebugMode_ObjCount, DebugMode_SpawnTable)
	DebugMode_ObjCount++
end event

event RSDKDraw
	DrawSprite(0)
end event

event RSDKLoad
	LoadSpriteSheet("Global/Display.gif")
	SpriteFrame(-16, -16, 32, 32, 1, 143)
end event
